import os
import csv
import re
def extract_last_row(csv_path):
    """读取CSV文件的最后一行，并提取指定列的值"""
    try:
        with open(csv_path, 'r', newline='') as f:
            reader = csv.reader(f)
            header = next(reader)  # 读取标题行
            last_row = None
            
            # 逐行读取直到最后一行（内存高效）
            for row in reader:
                last_row = row
            
            # 获取所需列的索引
            try:
                comm_type_idx = header.index('comm_type')
                real_time_idx = header.index('total_real_comm_time')
                predict_idx = header.index('c_lop_prediction_for_total_time')
            except ValueError as e:
                print(f"列名缺失: {e} in {csv_path}")
                return None
            
            return {
                'comm_type': last_row[comm_type_idx] if last_row else None,
                'total_real_comm_time': last_row[real_time_idx] if last_row else None,
                'predict_total_comm_time': last_row[predict_idx] if last_row else None
            }
    except Exception as e:
        print(f"处理文件出错 {csv_path}: {e}")
        return None

def process_csv_files(base_dir, target_dir):
    """主处理函数：遍历目录并生成汇总CSV"""
    output_path = os.path.join(target_dir, 'summary.csv')
    processed_count = 0
    skipped_count = 0

    with open(output_path, 'w', newline='') as outfile:
        writer = csv.DictWriter(outfile, fieldnames=[
            'base_dir', 'cn_dir', 'node_dir', 'proc_dir','comm_type',
            'total_real_comm_time', 'predict_total_comm_time','|total_real_comm_time - predict_total_comm_time| / total_real_comm_time'
        ])
        writer.writeheader()

        # 遍历base_dir的直接子文件夹
        for cn_dir in os.listdir(base_dir):
            cn_dir_path = os.path.join(base_dir, cn_dir)
            if not os.path.isdir(cn_dir_path):
                continue

            # 处理子文件夹中的CSV文件
            for filename in os.listdir(cn_dir_path):
                if not filename.lower().endswith('.csv'):
                    continue
                
                csv_path = os.path.join(cn_dir_path, filename)
                row_data = extract_last_row(csv_path)
                
                if not row_data:
                    skipped_count += 1
                    continue

                
                
                writer.writerow({
                    'base_dir': filename,
                    'cn_dir': extract_cn_info(filename),
                    'node_dir': extract_node_info(filename),
                    'proc_dir': extract_proc_info(filename),
                    'comm_type': row_data['comm_type'],
                    'total_real_comm_time': row_data['total_real_comm_time'],
                    'predict_total_comm_time': row_data['predict_total_comm_time'],
                    '|total_real_comm_time - predict_total_comm_time| / total_real_comm_time': abs(float(row_data['total_real_comm_time']) - float(row_data['predict_total_comm_time'])) / float(row_data['total_real_comm_time']) * 100
                })
                processed_count += 1
    
    print(f"处理完成: 成功处理 {processed_count} 个文件, 跳过 {skipped_count} 个文件")
    print(f"结果已保存至: {output_path}")


# 从文件名中提取 cn信息
def extract_cn_info(node_dir):
    """
    从node_dir字符串中提取cn[]或cnxx格式的节点信息
    1. 优先匹配cn[...]格式（如cn[8473-8474]）
    2. 其次匹配cnxx格式（如cn8473）
    3. 都未匹配到时返回空字符串
    """
    # 匹配cn[...]格式（如cn[8473-8474,9544-9545]）
    cn_bracket_match = re.search(r'cn\[([^\]]+)\]', node_dir)
    if cn_bracket_match:
        return f"cn[{cn_bracket_match.group(1)}]"
    
    # 匹配cnxx格式（如cn8473）
    cn_digit_match = re.search(r'cn\d+', node_dir)
    if cn_digit_match:
        return cn_digit_match.group(0)
    
    return ""  # 未匹配到任何格式

# 提取节点信息
def extract_node_info(node_dir):
    # 匹配 xxnode格式（如4node）
    node_match = re.search(r'\d+node', node_dir)
    if node_match:
        return node_match.group(0)
    return "" # 未匹配到任何格式

# 提取进行信息
def extract_proc_info(proc_dir):
    # 匹配 xxproc格式（如4proc）
    proc_match = re.search(r'\d+proc', proc_dir)
    if proc_match:
        return proc_match.group(0)
    return "" # 未匹配到任何格式
    
if __name__ == '__main__':


    # 配置路径 (根据实际需求修改)
    base_dir = r'F:\PostGraduate\Point-to-Point-DATA\deal-data-code\C-lop-Prediction\analysis_for_all_comm_type'  # 替换为实际基础目录
    target_dir =  os.path.join(base_dir,'all_predict_precision')
    
    # 确保目标目录存在
    os.makedirs(target_dir, exist_ok=True)
    
    # 执行处理
    process_csv_files(base_dir, target_dir)